MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ACM_位运算总结

Posted on 2011-11-13 21:58  MDeath-Kid  阅读(1361)  评论(0编辑  收藏  举报

~  |  &  ^  <<  >>

这些都是按位运算,什么意思?就是一位一位的进行运算。

 所以 ! 和 ~ 是不同的。

基本的操作:

and   -----   &

or     -----   |

取反  -----   ~

异或  -----   ^

同或  -----   ~(^) // 异或后求反

<<(左移)    >>(右移)

(真值表很容易在网上搜到,就不列了)

这5个基本的运算可以求出很多意想不到的东西。

下面是一些自己总结的:

一般位运算分为:取位操作、改位操作、功能性的操作。

取出某个数的某一位:

get_bit
bool get_bit(int t,int x) {
// 在 t 中,取出第 x 位 --从零开始
return t & (1<<(x));
}

 取出最低位:

lowbit()
#define lowbit(x) x & (-p)


改位:

change_bit()
//return int !

// 设置 x 的第 ith 位为 bool
#define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1<<(ith)))));

// 设置 x 的从第 ith 位起连续 k 位 为bol
int set(int x,int ith,int k,int bol)
{
while(k --)x = set_bit(x,ith+k,bol);
return x;
}


 要回寝室了,明天继续总结!

 11.11.21 10:00 补充:

摘自USACO的summary
a |= 0x20;        /* turn on bit 0x20 */
a &= ~0x20; /* turn off bit 0x20 */
a ^= 0x20; /* toggle bit 0x20 */
if (a & 0x20) {
/* then the 0x20 bit is on */
}

 一个位运算的地址:http://www.matrix67.com/blog/archives/266